package com.example.ymm.modules1.service.user;

import com.example.ymm.base.BaseService;
import com.example.ymm.model.TableList;
import com.example.ymm.model.YmPageDto;
import com.example.ymm.modules1.entity.my.user.DbCard;
import com.example.ymm.modules1.entity.my.user.DbChatGroup;
import com.example.ymm.modules1.entity.my.user.DbUser;
import com.example.ymm.modules1.service.dto.*;

import java.util.List;

public interface DbCardService extends BaseService<DbCard> {


    TableList<DbCard> list(DbCardQueryCriteria criteria, YmPageDto ymPage);

    List<DbCard> queryAll(DbCardQueryCriteria criteria);


    /**
     * 查询用户昨日的正常打卡记录，如果是补卡的要中断连续签到天数
     */
    DbCard queryYesterdayCardByUserId(String userId);


    /**
     * 提前读书，指定日期的昨天有没有打卡记录
     * 用户查询指定日期的 昨天有没有打卡(不是那个日期的打卡，而且那个日期的前一天的打卡)
     * @param userId
     * @return
     */
    DbCard queryAdvanceYesterdayByDate(String userId,String date);


    //查询用户今日的打卡记录
    DbCard queryTodayCardByUserId(String userId);


    /**
     * 查询用户今日的打卡记录
     * 可以是补卡，也可以是提前打卡
     * @param userId
     * @return
     */
    DbCard queryDateCardByUserId(String userId,String date);

    /**
     * 查询月满勤记录
     * @return
     */
    DbCard queryFullMonth(String userId,String month);

    DbCard addCard();

    DbCard addCardByDate(String date);

    /**
     * 提前打卡
     * @param date
     * @return
     */
    DbCard addAdvanceCardByDate(String date);

    /**
     * 后台补卡
     * @param card
     * @return
     */
    DbCard addSysCardByDate(String userId,String date);


    /**
     * 后台补卡 按正常读书的补卡 某一天 给积分
     * @param userId
     * @param date
     * @param integral
     * @return
     */
    DbCard addUserCardByDate(String userId,String date,int integral,String sysNote);

    /**
     * 系统后台正常打卡
     * @param userId
     * @return
     */
    DbCard addSysCardByNow(String userId,int integral);

    /**
     * 排行榜统计 打卡天数 ；不连续打卡
     * totalType 统计方式 1 从起始日期开始统计 2 当前月份 3 按当年统计
     */
    List<DbUser> countUserCardByGroup(List<DbUser> dbUsers, DbChatGroup group);


    /**
     * 排行榜
     * totalType 统计方式 1 从起始日期开始统计 2 当前月份 3 按当年统计
     */
    List<DbUser> getRankings(Integer totalType,String date_str);


    /**
     * 获取当月前5名
     * 匹配是在第几名
     */
    Integer getThisMonthRankings();

    Integer getThisMonthRankingsTest(String userId);

    /**
     * 统计 这个月连续打卡天数
     *
     * @return
     */
    Integer countDaysContinuous(String userId,String month);


    /**
     * 统计 连续打卡月数
     * @param criteria
     * @return
     */
    Integer countMonthsContinuous(String userId,String year);


    /**
     * 电脑排行榜
     * @param criteria
     * @return
     */
    TableList<SysRankingListDto> sysRankingList(SysRankingQueryCriteria criteria, YmPageDto pageDto);



    void testFn();

    /**
     * 获取缺卡日期
     * @return
     */
    List<String> getLackCards();


    /**
     * 获取可提前打卡日期
     * @return
     */
    List<String> getAdvanceCards();


    /**
     * 计算 提前读书的那五天当中 连续读了几天
     *
     * @return
     */
    Integer getUserAdvanceDays();
    /**
     * 获取从开始日期到，结束日期 这段时间打卡了几天 包含正常打卡，提前读书打卡
     * 从明天开始计算
     * @return 是否连续打卡
     */
    Integer getRangeDateCards(String startDate,String endDate);


    /**
     * 当天正常打卡，查询 提前读书的天数到今天是不是连续的，连续几天？
     * @param startDate
     * @return
     */
    Integer getRangeDateNowCard(String startDate);

    /**
     * 查询今天有没有补过卡
     * @return
     */
    Integer getTodayPatchCards();

    /**
     *
     * @param criteria
     * @param pageDto
     * @return
     */
    RankingTableUserDto dutyTableList(RankingUserQueryCriteria criteria, YmPageDto pageDto);


    /**
     * 用户年统计时长列表
     * @param criteria
     * @param ymPage
     * @return
     */
    TableList<UserTimeCountDto> getUserYearCount(DbCardQueryCriteria criteria, YmPageDto ymPage);


    /**
     * 用户 月统计时长列表
     * @param criteria
     * @param ymPage
     * @return
     */
    TableList<UserTimeCountDto> getUserMonthCount(DbCardQueryCriteria criteria, YmPageDto ymPage);

    /**
     * 用户每年的打卡时长
     * @param criteria
     * @return
     */
    List<UserTimeCountDto> getYearCount(DbCardQueryCriteria criteria);


    /**
     * 用户 打卡月份字符串
     * @param criteria
     * @return
     */
    List<UserTimeCountDto> getMonthCountList(DbCardQueryCriteria criteria);

}
